home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 February: Tool Chest / Dev.CD Feb 00 TC.toast / pc / tool chest / development kits / hypercard related / xcmds & xfcns / byrne's xcmds&xfcns / source / setfileinfo.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-03-06  |  4.6 KB  |  176 lines

  1. /*
  2.  
  3.     SetFileInfo XCMD v1.1
  4.     
  5.     ©1990-1 Apple Computer, Inc.; by Mike Byrne
  6.     
  7.     SetFileInfo is an XCMD to change the type or creator of a file.
  8.     
  9.     Form:
  10.     SetFileInfo <filename>, type | creator, <new value>
  11.     
  12.     # the MPW 3.2 build commands:
  13.     C -b SetFileInfo.c -mbg off
  14.         Link -w -t STAK -c WILD -rt XCMD=607 ∂
  15.             -m ENTRYPOINT ∂
  16.             -sg SetFileInfo ∂
  17.             SetFileInfo.c.o ∂
  18.             "{Libraries}HyperXLib.o" ∂
  19.             "{Libraries}Runtime.o" ∂
  20.             "{Libraries}Interface.o" ∂
  21.             "{CLibraries}StdCLib.o" ∂
  22.             -o "teststack"
  23. */
  24.  
  25. #include <Types.h>
  26. #include <Files.h>
  27. #include <string.h>
  28. #include <Memory.h>
  29. #include <Packages.h>
  30. #include "HyperXCmd.h"
  31.  
  32. #define NULL (long) 0
  33. #define NIL (long) 0
  34.  
  35. #define kNumParams 3
  36.  
  37.  
  38. /* prototypes */
  39. void ErrorBack(XCmdPtr paramPtr, char *message);
  40. void MoveLockParams ( XCmdPtr paramPtr, short paramCount );
  41. void UnlockParams  ( XCmdPtr paramPtr, short paramCount );
  42.  
  43.  
  44.  
  45. pascal void EntryPoint(XCmdPtr paramPtr)
  46. {
  47.     /* variable declarations */
  48.     OSType        newVal;
  49.     short         i,j;
  50.     char        volName[34];
  51.     char        ppathName[301];
  52.     short        vRefNum;
  53.     FInfo        infoRec;    
  54.     
  55.  
  56.     /* move high and lock the parameters. */
  57.     MoveLockParams(paramPtr, paramPtr->paramCount);
  58.  
  59.     /* check for copyright or syntax help request */
  60.     if (!strcmp( (char*)*paramPtr->params[0], "!") ) {
  61.         ErrorBack(paramPtr, "v1.1, ©1990-1 Apple Computer, Inc.; by Mike Byrne");
  62.         UnlockParams(paramPtr, paramPtr->paramCount);
  63.         return;
  64.     } else if (!strcmp ( (char*)*paramPtr->params[0], "?") ) {
  65.         ErrorBack(paramPtr, "SetFileInfo syntax is 'SetFileInfo <filename>, <type | creator>, <new value>'");
  66.         UnlockParams(paramPtr, paramPtr->paramCount);
  67.         return;
  68.     }
  69.  
  70.     /* not a copyright or help request.       */     
  71.     /* check for correct number of parameters */
  72.     if (paramPtr->paramCount != kNumParams) {
  73.         ErrorBack(paramPtr, "Error: SetFileInfo syntax is 'SetFileInfo <filename>, <type | creator>, <new value>'");
  74.         UnlockParams(paramPtr, paramPtr->paramCount);
  75.         return;
  76.     }
  77.  
  78.  
  79.     /*  extract the volume name from the handle, copy to a pas string,
  80.      and get the volume reference number of the volume              */
  81.     for (i=0; ((*(paramPtr->params[0]))[i] != ':' && (i < 33)); i++) 
  82.         { volName[i] = (*(paramPtr->params[0]))[i]; }
  83.     volName[i] = ':';
  84.     volName[i+1] = '\0'; 
  85.     c2pstr(volName);
  86.     vRefNum = 0;
  87.     
  88.     if (SetVol(volName, vRefNum) != noErr) {                        // toolbox
  89.         ErrorBack(paramPtr, "Error: Could not set the default volume");
  90.         UnlockParams(paramPtr, kNumParams);
  91.         return;
  92.     }
  93.     
  94.     if (GetVol(&volName, &vRefNum) != noErr) {                        // toolbox
  95.         ErrorBack(paramPtr, "Error: Could not find the volume requested.");
  96.         UnlockParams(paramPtr, kNumParams);
  97.         return;
  98.     }
  99.  
  100.     /* now, copy the rest of the pathname to the partial pathname and convert it. */
  101.     for (j=i; (j <= strlen((*(paramPtr->params[0]))) && (j < 300)); j++) 
  102.         { ppathName[j-i] = (*(paramPtr->params[0]))[j]; }
  103.     c2pstr(ppathName);                                                // toolbox    
  104.  
  105.     /* get the old info block for the file */
  106.     if ( GetFInfo(ppathName, vRefNum, &infoRec) != noErr) {            // toolbox
  107.         ErrorBack(paramPtr, "Error: Bad or unknown file name");
  108.         UnlockParams(paramPtr, kNumParams);
  109.         return;
  110.     }
  111.  
  112.     /* Move the second parameter into the new value and assign it to whatever is desired */
  113.     BlockMove( (char*)*(paramPtr->params[2]), (Ptr)&newVal, sizeof(OSType) );            // toolbox
  114.     if ( (((char*)*(paramPtr->params[1]))[0] == 't') || (((char*)*(paramPtr->params[1]))[0] == 'T') ) {
  115.         infoRec.fdType = newVal;
  116.     } else {
  117.         infoRec.fdCreator = newVal;
  118.     }    
  119.  
  120.     /* set the new information */
  121.     if ( SetFInfo(ppathName, vRefNum, &infoRec) != noErr) {            // toolbox
  122.         ErrorBack(paramPtr, "Error: Bad, locked, or nonexistant file.");
  123.     }
  124.     UnlockParams(paramPtr, kNumParams);
  125.     return;
  126. }
  127.  
  128.  
  129.  
  130.  
  131.  
  132.     
  133. /* allocate and load up paramPtr->returnValue with a string 
  134.    -------------------------------------------------------- */
  135. void ErrorBack(XCmdPtr paramPtr, char *message)
  136. {
  137.     Handle  mesHnd;
  138.  
  139.     /*
  140.         Allocate space for an error message.
  141.         Copy the string into it.
  142.         Return the handle to HyperCard.
  143.     */
  144.     mesHnd = NewHandle((long)(strlen(message)+1));
  145.     if (mesHnd == nil) return;
  146.     strcpy((char *)*mesHnd,message);
  147.     paramPtr->returnValue = mesHnd;
  148. }
  149.  
  150.  
  151.  
  152. /*  move high and lock down all parameters  
  153.     ----------------------------------------------------------------------- */
  154. void MoveLockParams ( XCmdPtr paramPtr, short paramCount )
  155. {
  156.     short i;
  157.     
  158.     for(i=0; i <= paramCount-1; i++)
  159.     {
  160.         MoveHHi(paramPtr->params[i]);
  161.         HLock(paramPtr->params[i]);
  162.     }
  163. }
  164.  
  165.  
  166.  
  167.  
  168. /* unlock all parameter handles in the XCmdBlock  
  169.    ---------------------------------------------  */
  170. void UnlockParams  ( XCmdPtr paramPtr, short paramCount )
  171. {    short i;
  172.     
  173.     for(i=0; i <= paramCount-1; i++)
  174.         { HUnlock(paramPtr->params[i]);}
  175. }
  176.